
package com.semac.server.rpc;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import com.semac.client.rpc.SemanacRPCService;
import com.semac.server.database.classesbase.Database;
import com.semac.server.database.fetchers.SemanaAcademicaDataFetcher;
import com.semac.shared.exceptions.AuthenticationException;
import com.semac.shared.exceptions.RPCExceptions;
import com.semac.shared.model.SemanaAcademica;

public class SemanacRPCServiceImpl extends SemacRemoteServiceServlet implements SemanacRPCService {
	private static final long serialVersionUID = 1147837039743750030L;

	@Override
	public Integer salvaSemanaAcademica(SemanaAcademica semana) throws RPCExceptions, AuthenticationException {
		//verifica se tem permissao
		if (!this.getPessoaLogadaNaSession().ehComex()){
			throw new AuthenticationException("Permissão Negada!");
		}
		
		//testa para ver se a semana tem um id. Se tiver um id significa que estamos fazendo um update
		if (semana == null)
			throw new RPCExceptions("Erro ao salvar/atualizar semana academica, argumento passado para o servidor é inválido (nulo). ");
		
//
//		try {
//			wait(2000);
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
		
		if ( semana.getDataFim() == null ||
				semana.getDataIni() == null || 
				semana.getDescricao() == null ||
				semana.getFimInscricao() == null || 
				semana.getInicioInscricao() == null)
			throw new RPCExceptions("Dados da semana academica incompletos.");
	
		if (semana.getCodSemana() != null)
			return this.updateNoBanco(semana);
		else
			return this.salvaNoBanco(semana);
		
	}


	@Override
	public ArrayList<SemanaAcademica> getSemanasAcademicasLike(SemanaAcademica semana) throws RPCExceptions, AuthenticationException {
		if (!this.getPessoaLogadaNaSession().ehComex()){
			throw new AuthenticationException("Permissão Negada!");
		}
		String where = "";
		if (semana.getCodSemana() != null)
			where += "\"codSemana\"=" + semana.getCodSemana();
		
		SemanaAcademicaDataFetcher fetcher = new SemanaAcademicaDataFetcher(where);
		
		try {
			Database.getInstance().doSelect(fetcher);
		} catch (SQLException e) {
			throw new RPCExceptions(e.getMessage());
		}
		
		return fetcher.getFetchedData();
		
	}
	
	


	@Override
	public void excluirSemanaAcademica(int id) throws RPCExceptions, AuthenticationException {
		if (!this.getPessoaLogadaNaSession().ehComex()){
			throw new AuthenticationException("Permissão Negada!");
		}
		
		try {
			Database.getInstance().delete("semana_academica", "\"codSemana\"=" + id);
		} catch (SQLException e) {
			throw new RPCExceptions(e.getMessage());
		}
		
		
	}
	
	
	/**
	 * salva uma semana no banco
	 * @param semana
	 * @return
	 * @throws RPCExceptions
	 */
	private Integer salvaNoBanco(SemanaAcademica semana) throws RPCExceptions {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		
		String fields = "\"ativa\",\"dataIni\", \"dataFim\", \"dataIniInscricoes\", \"dataFimInscricoes\", \"descricao\"";
		String values = (semana.isAtiva()?"'t'":"'f'") + " , '" + 
						formatter.format(semana.getDataIni()) + "' , '" + 
						formatter.format(semana.getDataFim())  + "' , '" +
						formatter.format(semana.getInicioInscricao())  + "' , '" +
						formatter.format(semana.getFimInscricao())  + "' , '" +
						semana.getDescricao() + "'";
		
		
		Integer result = null;
		try {
			result = Database.getInstance().insert("semana_academica", fields, values);
		} catch (SQLException e) {
			throw new RPCExceptions(e.getMessage());
		}
		
		//se ha outra semana ativa, desativa ela (elas??)
		this.desativaOutrasSemanas(semana);
		
		return result;
	}

	
	/**
	 * faz update de uma semana no banco
	 * @param semana
	 * @return
	 * @throws RPCExceptions 
	 */
	private Integer updateNoBanco(SemanaAcademica semana) throws RPCExceptions {
		if (semana.getCodSemana() == null)
			throw new RPCExceptions("Erro no update da semana. Id nula.");
		
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		//primeiro faz update dessa semana.
		String set = "\"ativa\" = " + (semana.isAtiva()?"'t'":"'f'") + "," +
					 "\"dataIni\" = '" + formatter.format(semana.getDataIni()) + "', " +
					 "\"dataFim\" = '" + formatter.format(semana.getDataFim()) + "', " +
					 "\"dataIniInscricoes\" = '" + formatter.format(semana.getInicioInscricao()) + "', " +
					 "\"dataFimInscricoes\" = '" + formatter.format(semana.getFimInscricao()) + "', " +
					 "\"descricao\"= '" + semana.getDescricao() + "'";
		
		try {
			Database.getInstance().update("semana_academica", set, "\"codSemana\" = " + semana.getCodSemana());
		} catch (SQLException e) {
			throw new RPCExceptions(e.getMessage());
		}
		//se ha outra semana ativa, desativa ela (elas??)
		this.desativaOutrasSemanas(semana);
		
		return semana.getCodSemana();
	}
	
	
	private void desativaOutrasSemanas(SemanaAcademica semana) throws RPCExceptions{
		//dai se ela ficou ativa, desativar todas outras.
		if (semana.isAtiva()){
			try {
				Database.getInstance().update("semana_academica", "\"ativa\" = 'f'", "\"codSemana\" <> " + semana.getCodSemana());
			} catch (SQLException e) {
				throw new RPCExceptions(e.getMessage());
			}
		}	
	}


	@Override
	public SemanaAcademica pegaSemanaAcademicaAtiva() throws RPCExceptions, AuthenticationException {
		
		String where = "";
		where += "\"ativa\"='t'";
		
		SemanaAcademicaDataFetcher fetcher = new SemanaAcademicaDataFetcher(where);
		
		try {
			Database.getInstance().doSelect(fetcher);
		} catch (SQLException e) {
			throw new RPCExceptions(e.getMessage());
		}
		
		return fetcher.getFirstOccurrence();
			
		
	}

	
	
}
